﻿package exodecorateur_angryballs.maladroit;

import java.awt.Color;
import java.util.Vector;

import mesmaths.geometrie.base.Vecteur;
import angryballsDecorateur.modele.acceleration.FrottementAirDecorateur;
import angryballsDecorateur.modele.acceleration.MvtNewtonDecorateur;
import angryballsDecorateur.modele.acceleration.PesanteurDecorator;
import angryballsDecorateur.modele.bases.BilleDecorable;
import angryballsDecorateur.modele.bases.BilleDecore;
import angryballsDecorateur.modele.collisions.ArretDecorateur;
import angryballsDecorateur.modele.collisions.PasseMurailleDecorateur;
import angryballsDecorateur.modele.collisions.RebondDecorateur;
import angryballsDecorateur.sounds.CollisionSoundPlayer;
import exodecorateur_angryballs.maladroit.vues.CadreAngryBalls;

/**
 * Gestion d'une liste de billes en mouvement ayant toutes un comportement
 * différent
 * 
 * Idéal pour mettre en place le DP decorator
 * */
public class TestAngryBalls {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// ------------------- création de la liste (pour l'instant vide) des
		// billes -----------------------

		Vector<BilleDecorable> billes = new Vector<BilleDecorable>();

		// ---------------- création de la vue responsable du dessin des billes
		// -------------------------

		CadreAngryBalls cadre = new CadreAngryBalls(
				"Angry balls",
				"Animation de billes ayant des comportements différents. Situation idéale pour mettre en place le DP Decorator",
				billes);

		cadre.montrer(); // on rend visible la vue

		// ------------- remplissage de la liste avec 4 billes
		// -------------------------------

		double xMax, yMax;
		double vMax = 0.1;
		xMax = cadre.largeurBillard(); // abscisse maximal
		yMax = cadre.hauteurBillard(); // ordonnée maximale

		double rayon = 0.05 * Math.min(xMax, yMax); // rayon des billes : ici
													// toutes les billes ont le
													// même rayon, mais ce n'est
													// pas obligatoire

		Vecteur p0, p1, p2, p3, p4, v0, v1, v2, v3, v4; // les positions des
														// centres des billes et
														// les vecteurs vitesse
														// au démarrage.
														// Elles vont être
														// choisies
														// aléatoirement

		// ------------------- création des vecteurs position des billes
		// ---------------------------------

		p0 = Vecteur.créationAléatoire(0, 0, xMax, yMax);
		p1 = Vecteur.créationAléatoire(0, 0, xMax, yMax);
		p2 = Vecteur.créationAléatoire(0, 0, xMax, yMax);
		p3 = Vecteur.créationAléatoire(0, 0, xMax, yMax);
		p4 = Vecteur.créationAléatoire(0, 0, xMax, yMax);

		// ------------------- création des vecteurs vitesse des billes
		// ---------------------------------

		v0 = Vecteur.créationAléatoire(-vMax, -vMax, vMax, vMax);
		v1 = Vecteur.créationAléatoire(-vMax, -vMax, vMax, 0);
		v2 = Vecteur.créationAléatoire(-vMax, -vMax, vMax, vMax);
		v3 = Vecteur.créationAléatoire(-vMax, -vMax, vMax, vMax);
		v4 = Vecteur.créationAléatoire(-vMax, -vMax, vMax, vMax);

		// --------------- ici commence la partie à changer
		// ---------------------------------
		// TODO Modifier ces 5 lignes
		// billes.add(new BilleMvtRURebond(p0, rayon, v0, Color.red));
		// billes.add(new BilleMvtPesanteurFrottementRebond(p1, rayon, v1,
		// new Vecteur(0, 0.001), Color.yellow));
		// billes.add(new BilleMvtNewtonFrottementRebond(p2, rayon, v2,
		// Color.green));
		// billes.add(new BilleMvtRUPasseMurailles(p3, rayon, v3, Color.cyan));
		// billes.add(new BilleMvtNewtonArret(p4, rayon, v4, Color.black));
		billes.add(new RebondDecorateur(new BilleDecore(p0, rayon, v0,
				Color.red)));
		billes.add(new FrottementAirDecorateur(new PesanteurDecorator(
				new RebondDecorateur(new BilleDecore(p1, rayon, v1,
						Color.yellow)), new Vecteur(0, 0.001))));
		billes.add(new FrottementAirDecorateur(new MvtNewtonDecorateur(
				new RebondDecorateur(
						new BilleDecore(p2, rayon, v2, Color.green)))));
		billes.add(new PasseMurailleDecorateur(new BilleDecore(p3, rayon, v3,
				Color.cyan)));
		billes.add(new MvtNewtonDecorateur(new ArretDecorateur(new BilleDecore(
				p4, rayon, v4, Color.black))));

		for (BilleDecorable bille : billes)
			bille.addObserver(new CollisionSoundPlayer());

		// ---------------------- ici finit la partie à changer
		// -------------------------------------------------------------

		System.out.println("billes = " + billes);

		// -------------------- création de l'objet responsable de l'animation
		// (c'est un thread séparé) -----------------------

		AnimationBilles animationBilles = new AnimationBilles(billes, cadre);

		// ----------------------- mise en place des écouteurs de boutons qui
		// permettent de contrôler (un peu...) l'application -----------------

		// EcouteurBoutonLancer écouteurBoutonLancer = new EcouteurBoutonLancer(
		// animationBilles);
		// EcouteurBoutonArreter écouteurBoutonArrêter = new
		// EcouteurBoutonArreter(
		// animationBilles);

		// ------------------------- activation des écouteurs des boutons et ça
		// tourne tout seul ------------------------------

		// cadre.lancerBilles.addActionListener(écouteurBoutonLancer); //
		// maladroit
		// // mais ne
		// // changez
		// // rien
		// cadre.arrêterBilles.addActionListener(écouteurBoutonArrêter); //
		// maladroit
		// // mais
		// // ne
		// // changez
		// // rien

	}

}
